import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { ElMessage } from 'element-plus'
import api from '../api' // 假设有一个API服务
import { useRouter } from 'vue-router'

export const useUserStore = defineStore('user', () => {
  // 状态 - 初始化时从localStorage获取
  const token = ref(localStorage.getItem('token') || '')
  const user = ref(JSON.parse(localStorage.getItem('user') || 'null'))
  const loading = ref(false)
  const router = useRouter()
  
  // 计算属性
  const isLoggedIn = computed(() => !!token.value)
  
  // 操作方法
  
  /**
   * 用户登录
   * @param {Object} credentials - 包含用户名和密码的对象
   */
  const login = async (credentials) => {
    loading.value = true
    
    try {
      // 实际的API调用
      const data = await api.post('/auth/login', credentials)
      // 适配统一响应格式
      if (data.code === 0 && data.result) {
        token.value = data.result.token
        localStorage.setItem('token', data.result.token)
        user.value = data.result.user
        localStorage.setItem('user', JSON.stringify(data.result.user))
        return data.result
      } else {
        throw new Error(data.msg || '登录失败')
      }
    } catch (error) {
      console.error('登录失败:', error)
      ElMessage.error(error.message || '登录失败，请检查用户名和密码')
      throw error
    } finally {
      loading.value = false
    }
  }
  
  /**
   * 用户注册
   * @param {Object} userData - 包含用户注册信息的对象
   */
  const register = async (userData) => {
    loading.value = true
    
    try {
      // 实际的API调用
      const data = await api.post('/auth/register', userData)
      
      // 如果希望注册后自动登录，保存token和用户信息
      if (data.token && data.user) {
        token.value = data.token
        localStorage.setItem('token', data.token)
        
        user.value = data.user
        localStorage.setItem('user', JSON.stringify(data.user))
      }
      
      return data
    } catch (error) {
      console.error('注册失败:', error)
      ElMessage.error('注册失败，请稍后重试')
      throw error
    } finally {
      loading.value = false
    }
  }
  
  /**
   * 获取用户个人资料
   */
  const fetchUserProfile = async () => {
    if (!token.value) return null
    
    loading.value = true
    
    try {
      // 实际的API调用
      const data = await api.get('/user/profile')
      
      // 更新用户信息并保存到localStorage
      user.value = data
      localStorage.setItem('user', JSON.stringify(data))
      
      return data
    } catch (error) {
      console.error('获取用户资料失败:', error)
      
      // 如果是401错误，则登出用户
      if (error.response && error.response.status === 401) {
        logout()
      }
      
      throw error
    } finally {
      loading.value = false
    }
  }
  
  /**
   * 更新用户个人资料
   * @param {Object} profileData - 要更新的个人资料数据
   */
  const updateProfile = async (profileData) => {
    if (!token.value) return null
    loading.value = true
    try {
      // 实际的API调用
      const data = await api.put('/user/profile', profileData)
      // 更新本地用户信息并保存到localStorage
      user.value = {
        ...user.value,
        ...data
      }
      localStorage.setItem('user', JSON.stringify(user.value))
      ElMessage.success('个人资料更新成功')
      return user.value
    } catch (error) {
      // 手机号唯一性错误友好提示
      if (error.response && error.response.data && error.response.data.msg && error.response.data.msg.includes('手机号')) {
        ElMessage.error('手机号已被使用')
      } else {
        ElMessage.error('更新失败，请稍后重试')
      }
      throw error
    } finally {
      loading.value = false
    }
  }
  
  /**
   * 更改密码
   * @param {Object} passwordData - 包含当前密码和新密码的对象
   */
  const changePassword = async (passwordData) => {
    if (!token.value) return null
    
    loading.value = true
    
    try {
      // 实际的API调用
      await api.put('/user/password', passwordData)
      
      ElMessage.success('密码更新成功')
      return true
    } catch (error) {
      console.error('更改密码失败:', error)
      ElMessage.error('密码更新失败，请稍后重试')
      throw error
    } finally {
      loading.value = false
    }
  }
  
  /**
   * 用户登出
   */
  const logout = (options = {}) => {
    // 清除token
    token.value = ''
    localStorage.removeItem('token')
    
    // 清除用户信息
    user.value = null
    localStorage.removeItem('user')
    
    // 标记token是否过期（用于登录页面显示提示）
    if (options.expired) {
      localStorage.setItem('tokenExpired', 'true')
    }
    
    // 可以添加实际的API调用（如果需要）
    // api.post('/auth/logout')
    
    // 如果提供了重定向参数，则执行重定向
    if (options.redirect) {
      router.push(options.redirect)
    }
  }
  
  /**
   * 初始化认证状态（已在ref初始化中处理）
   */
  const initAuth = () => {
    const savedToken = localStorage.getItem('token')
    const savedUser = localStorage.getItem('user')
    
    if (savedToken) {
      token.value = savedToken
      // 如果有用户数据则解析，否则保持为null
      if (savedUser) {
        try {
          user.value = JSON.parse(savedUser)
        } catch (e) {
          console.error('解析用户数据失败', e)
          user.value = null
        }
      }
    }
  }
  
  return {
    // 状态
    token,
    user,
    loading,
    isLoggedIn,
    
    // 操作方法
    login,
    register,
    fetchUserProfile,
    updateProfile,
    changePassword,
    logout,
    initAuth
  }
})